/* Copyright 2021 Kerim Yalcin
**
**   Licensed under the Apache License, Version 2.0 (the "License");
**   you may not use this file except in compliance with the License.
**   You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
**   Unless required by applicable law or agreed to in writing, software
**   distributed under the License is distributed on an "AS IS" BASIS,
**   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
**   See the License for the specific language governing permissions and
**   limitations under the License.
*/

#include "Error.hpp"

#include <iostream>

namespace Agx {

Error::Error(const std::string& pClass_Name) :
    mClass_Name {pClass_Name},
    mPreMessage_1 {"Error: Agx::"},
    mDoubleColon {"::"},
    mColonSpace {": "}
{}

Error& Error::print_fromWin32(const std::string& pFunction_Name) {
    LPSTR buffer = nullptr;
    const DWORD lastError = GetLastError();
    const DWORD size = FormatMessageA(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        nullptr,
        lastError,
        0,
        (LPSTR) &buffer,
        0,
        nullptr
    );
    const std::string errorMessage(buffer, size);

    std::cout <<
        mPreMessage_1 << mClass_Name <<
        mDoubleColon << pFunction_Name << 
        mColonSpace << errorMessage;

    LocalFree(buffer);
    return *this;
}

Error& Error::print_fromInterAct(const std::string& pFunction_Name, const std::string& pErrorMessage) {
    std::cout << 
        mPreMessage_1 << mClass_Name <<
        mDoubleColon << pFunction_Name << 
        mColonSpace << pErrorMessage << std::endl;

    return *this;
}

}